/**
 * IPv4 输入控件 继承{zxt.ui.Interactor}类
 * @class IPv4 输入控件类
 */
zxt.ui.IPAddr = function(){
	zxt.ui.Interactor.call(this);
  this._jqDom = $("<div class='IPDiv' nowrap/>");
};

zxt.ui.IPAddr.VERSION = 4;
zxt.ui.IPAddr.MSG_IP_INVALID = "IP address must between 0 and 255!";

zxt.defineClazz(zxt.ui.IPAddr, zxt.ui.Interactor);

/**
 * <p>
 * 返回控件类型
 * </p>
 * 
 * @function
 * @return {string} “zxt.ui.IPAddr"
 */
zxt.ui.IPAddr.prototype.getType = function(){
	return "zxt.ui.IPAddr";
};

/**
 * <p>
 * IPv4控件校验函数 未实现 返回true
 * </p>
 * 
 * @function
 * @return {Boolean} 校验结果
 */
zxt.ui.IPAddr.prototype.validate = function(value){
	return true;
};

/**
 * IPv4控件渲染函数
 * 
 * @function
 * @return {Dom} 渲染后的Dom节点
 */
zxt.ui.IPAddr.prototype.renderSelf = function(){
	var content = this.val() || '0.0.0.0';
	this._jqDom.empty();
	var jqDom = this._jqDom;
	var ipAddrs = content.split('.');		
	var host = this;	
	$.each(ipAddrs, function(i, ipAddr) {
		var input = $("<input class='IPInput'>").val(ipAddr);
		input.attr("id", "ip" + i);
		input.keydown(function(event) { 
			return host.onKeyDown(input, event);
		}).keyup(function(event) { 
			host.onKeyUp(input, event);
		}).change(function(event) { 
			host.onChange(input, event); 
		}).select(function(event) {
			host.selected = i;
		});
		jqDom.append(input);
		if (i < ipAddrs.length - 1)
			jqDom.append(".");
	});	
	return this._jqDom.get(0);
};

/**
 * 控件获得内部值方法 如果内容不符合校验规则，则返回空
 * @function
 * @return {string} 以.分隔的ip地址
 */
zxt.ui.IPAddr.prototype.getSelfValue = function(){
	var ipAddr = "", host = this;
	var textArr = $( "input[type='text']", this._jqDom );
	$(textArr, this.jqDom).each(function(i, text) {
		ipAddr += text.value;
		if (i < textArr.length - 1)
			ipAddr += ".";
	});
	
	var ipAddrs = ipAddr.split('.');
		
	for (var i = 0; i < ipAddrs.length; i++) {
		if (!this._validate(ipAddrs[i])) {
			return;
		}
	}	
	return ipAddr;
};

/**
 * 控件值改变方法，对改变的值进行校验
 * @function
 * @param {Jquery} input IP控件内的Input节点的Jquery对象
 * @param {EVENT} event 事件对象
 * @return {string} 以.分隔的ip地址
 */
zxt.ui.IPAddr.prototype.onChange = function(input, event) {
	if (!this._validate(input.val())) {
		alert(zxt.ui.IPAddr.MSG_IP_INVALID);
		if (this.oldValue != undefined) input.val(this.oldValue);			
		input.focus();
	} else {
		input.val(parseInt(input.val(), 10));
	}	
	this.oldValue = undefined;
};

/**
 * IP控件按键释放事件 做了输入值校验，同时屏蔽了非数字值的输入
 * 如果IP数值输满3位，自动跳到下一个输入框并选中.
 * @function
 * @param {Jquery} input IP控件内的Input节点的Jquery对象
 * @param {EVENT} event 事件对象
 */
zxt.ui.IPAddr.prototype.onKeyUp = function(input, event) {
	var keyCode = event.keyCode;
	if (keyCode >= 48 && keyCode <= 57) {	// 数字键.		
		var index = parseInt(input.attr("id").substr(2));	// 第index个input
		if (input.val().length == 3) {				// 如果IP数值输满3位，自动跳到下一个输入框并选中.
			if (index < zxt.ui.IPAddr.VERSION - 1) { 
				$("#ip" + (index + 1), this.jquery).select();
				this.onChange(input, event);
			} else
				$("#ip" + index, this.jquery).blur();
		}
	}
};

/**
 * IP控件按键按下事件 做了输入值校验，同时屏蔽了非数字值的输入
 * 记住编辑IP的原始值.如果有选中的数字，为编辑状态.
 * 点(.)、Tab键及空格，向后移动焦点.
 * @function
 * @param {Jquery} input IP控件内的Input节点的Jquery对象
 * @param {EVENT} event 事件对象
 */
zxt.ui.IPAddr.prototype.onKeyDown = function(input, event) {
	var keyCode = event.keyCode;
	var index = parseInt(input.attr("id").substr(2));	// 第index个input
	
	if (keyCode >= 48 && keyCode <= 57) {	// 数字键：合法.
		if (this.oldValue == undefined) {
			this.oldValue = input.val();	// 记住编辑IP的原始值.
		};
		if (this.selected == index) {		// 如果有选中的数字，为编辑状态.
			this.selected = undefined;
			return true;
		};

		return (input.val().length < 3);		
	};

	var key = zxt.ui.IPAddr.KEY_CODE;
	if (keyCode == key['.'] || 				// 点(.)、Tab键及空格，向后移动焦点.
		keyCode == key.TAB ||
		keyCode == key.Space) {
		if (index < zxt.ui.IPAddr.VERSION - 1) {
			$("#ip" + (index + 1), this.jquery).select();	// 下一个input聚焦.
			this.onChange(input, event);
			return false;
		};
		return (keyCode == key.TAB);
	};
	
	return this._validKey(keyCode);
};

/**
 * 判断keyCode是否为合法按键，以下按键视为非法:
 * 字母键[A-Z], SHIFT 以及符号键`-=\[];',/
 * @function
 * @private
 * @param {Int} keyCode 按键代码
 * @return {Boolean} 校验是否合法
 */
zxt.ui.IPAddr.prototype._validKey = function(keyCode) {
	var k = zxt.ui.IPAddr.KEY_CODE;
	
	if (keyCode >= k['A'] && keyCode <= k['Z']) {
		return false;			// 字母键非法
	}
	
	var invalids = [			// 其它非法键值
		k.Shift, k['`'], k['-'], k['='], k['\\'], 
		k['['], k[']'], k[';'], k['\''], k[','], k['/']  
	];
	
	for (i = 0; i < invalids.length; i++) {
		if (invalids[i] == keyCode)
			return false;
	};
	
	return true;
};

/**
 * 判断传入的IP是否为合法IP
 * @function
 * @private
 * @param {string} ip地址中的一段 如192.168.1.1中的192
 * @return {Boolean} 校验是否通过
 */
zxt.ui.IPAddr.prototype._validate = function(ip) {
	var valid = ip.match(/^\d{1,3}$/);		// 匹配1~3个数字.
	if (valid) {
		ip = parseInt(ip);
		valid = (0 <= ip && ip <= 255);		// 0~255
	}	
	return valid;
};

/**
 * 复制IP地址控件，但目前没有实现内部数据复制功能，只是新建了一个IP控件对象
 * @function
 * @return {zxt.ui.IPAddr} IPv4控件对象
 */
zxt.ui.IPAddr.prototype.clone = function(){
	var copy = new zxt.ui.IPAddr();
	return copy;
};

zxt.ui.IPAddr.KEY_CODE = {
	Tab:	9,
	Shift:	16,
	Space:	32,
	';':	59,
	'=':	61,	
	A:		65,
	Z:		90,
	'-':	109,
	',':	188,
	'.':	190,
	'/':	191,
	'`':	192,
	'[':	219,
	'\\':	220,
	']':	221,
	'\'':	222
};

/**
 * IP控件工厂类
 * @class IP控件工厂类
 */
zxt.ui.IPAddrFactory = function(){
	zxt.ui.InteractorFactory.call(this);
};

zxt.defineClazz(zxt.ui.IPAddrFactory, zxt.ui.InteractorFactory);

zxt.ui.IPAddrFactory.prototype.getInstance = function(){
	return new zxt.ui.IPAddr();
};

zxt.ui.IPAddrFactory.prototype.parse = function(elem){
};